package com.hxl.qqclient.service;

import com.hxl.qqcommon.Message;
import com.hxl.qqcommon.MessageType;
import com.hxl.qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 该类完成用户登陆验证和用户注册等功能
 */
public class UserClientService {
    //在其他地方会使用user信息，因此做成一个成员属性
    private User u = new User();
    //因为Socket在其他地方也可能使用，因此做出属性
    private Socket socket;

    //根据userId和pwd到服务器验证该用户是否合法
    public boolean checkUser(String userId, String pwd) throws IOException, ClassNotFoundException {
        boolean b = false;
        //创建User对象
        u.setUserId(userId);
        u.setPasswd(pwd);
        //连接到服务端，发送u对象
        socket = new Socket(InetAddress.getLocalHost(), 9999);
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        oos.writeObject(u);
        //读取从服务端回复的Message对象
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        Message ms = (Message) ois.readObject();
        if (ms.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {//登陆ok

            //创建一个和服务端保持通信的线程->创建一个类ClientConnectServerThread
            ClientConnectServerThread clientConnectServerThread = new ClientConnectServerThread(socket);
            //启动客户端的线程
            clientConnectServerThread.start();
            //为了后面客户端的扩展，我们将线程放入到集合管理
            ManagerClientConnectServerThread.addClientConnectServerThread(userId, clientConnectServerThread);
            b = true;
        } else {
            //如果登陆失败，我们就不能启动和服务器通信的线程，关闭socket
            socket.close();
        }
        return b;
    }
    //向服务器端请求在线用户列表
    public void onlineFriendList(){
        //发送一个Message,类型 String MESSAGE_GET_ONLINE_FRIEND
        Message message = new Message();
        message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        message.setSender(u.getUserId());
        //发送给服务器
        //应该得到当前线程的Socket对应的ObjectOutputStream对象
        try {
            //从管理线程的集合中，通过userid，得到这个线程对象
            ClientConnectServerThread clientConnectServerThread = ManagerClientConnectServerThread.getClientConnectServerThread(u.getUserId());
            //通过这个线程得到关联的socket
            Socket socket = clientConnectServerThread.getSocket();
            //得到当前线程的Socket 对应的ObjectOutputStream对象
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);//发送一个message对象，向服务端要在线用户列表
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //编写方法，退出客户端，并给服务器端发送一个退出系统的message对象
    public void logout(){
        Message message = new Message();
        message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);
        message.setSender(u.getUserId());//一定要指定我是哪个客户端id
        //发送message
        try {
//            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                ObjectOutputStream   oos = new ObjectOutputStream
                        (ManagerClientConnectServerThread.getClientConnectServerThread(u.getUserId()).getSocket().getOutputStream());
            oos.writeObject(message);
            System.out.println(u.getUserId()+"退出系统");
            System.exit(0);//结束进程
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}